在選擇剪下時,我們可以建立一個新的 canvas來建立我們所剪下的內容
  /**
   * 滑鼠點下畫布
   */
  const handleMouseDown = (event: any) => {
   ....
      case "select":
        createCanvas(point);
        break;
      default:
        break;
    }
  };
/** 建立選擇的 canvas */
  const createCanvas = (point: any, ctx) => {
    const div = document.createElement("div");
    div.style.position = "absolute";
    div.style.left = point?.x + "px";
    div.style.top = point?.y + "px";
    div.style.width = 200 + "px";
    div.style.height = 200 + "px";
    div.style.zIndex = "10";
    div.style.border = `2px dashed #999`;
    const b = document.createElement("canvas");
    b.width = 200;
    b.height = 200;
    div.appendChild(b);
    div.style.cursor = `url(${moveIcon}) 8 8, move`;
    canvasWrapRef.current.appendChild(div);
    let dragFlag = false;
    let x = 0,
      y = 0;
// 可任意移動
    div.onmousedown = (e) => {
      e = e || window.event;
      x = e.clientX - div.offsetLeft;
      y = e.clientY - div.offsetTop;
      dragFlag = true;
    };
    div.onmousemove = (e) => {
      if (dragFlag) {
        e = e || window.event;
        div.style.left = e.clientX - x + "px";
        div.style.top = e.clientY - y + "px";
      }
    };
    div.onmouseup = function (e) {
      dragFlag = false;
    };
  };

但目前上面只寫到了建立,重點的剪下沒有做到!
這時又需要 canvas 的 API 了
來到今天的學習重點
CanvasRenderingContext2D.getImageData() getImageData()返回一個ImageData對象,該 對象表示畫布指定部分的底層像素數據。
此方法不受畫布變換矩陣的影響。如果指定的矩形超出畫布邊界,則畫布外的像素在返回的對ImageData像中為透明黑色。
CanvasRenderingContext2D.putImageData() Canvas 2D API 的 方法將來自給定ImageData對象的數據繪製到畫布上。如果提供了臟矩形,則僅繪製該矩形中的像素。此方法不受畫布變換矩陣的影響。畫布邊界,則畫布外的像素在返回的對ImageData像中為透明黑色。
所以只需要在剛才的 createCanvas 底下補上以下的程式碼
 let imageData = ctx.getImageData(point.x, point.y, b.width, b.height);
    const ctx_b = b.getContext("2d");
    ctx_b && ctx_b.putImageData(imageData, 0, 0);
    ctx.clearRect(point.x, point.y, b.width, b.height);
b->> 剛才所新建立的 canvasctx ->> 原先的 canvas
查看效果
